package com.obelisco.modelo.servicios.seguridad;

import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.hibernate.Query;
import org.hibernate.Session;

//import ucla.cumlaude.modelo.data.PlanEstudio;

import com.obelisco.modelo.dao.ITransaccionDAO;
import com.obelisco.modelo.dao.hibernate.TransaccionPreferidaDAO;
import com.obelisco.modelo.data.Grupo;
import com.obelisco.modelo.data.Sistema;
import com.obelisco.modelo.data.Transaccion;
import com.obelisco.modelo.data.TransaccionPreferida;
import com.obelisco.modelo.data.Usuario;

public class ServicioSeguridad implements IServicioSeguridad {

	private ITransaccionDAO transaccionDAO;
	
	private TransaccionPreferidaDAO transaccionPreferidaDAO;
	
	private Sistema sistema;
	

	public Sistema getSistema() {
		return sistema;
	}

	public void setSistema(Sistema sistema) {
		this.sistema = sistema;
	}

	public Transaccion buscarTransaccion(String accesorapido) {
		// TODO Auto-generated method stub
		Transaccion transaccion = null;
		List<Transaccion> transacciones = transaccionDAO.findByProperty("accesorapido", accesorapido.toUpperCase());
		for (Transaccion t : transacciones) {
			transaccion = t;
		}
		return transaccion;
	}

	public ITransaccionDAO getTransaccionDAO() {
		return transaccionDAO;
	}

	public void setTransaccionDAO(ITransaccionDAO transaccionDAO) {
		this.transaccionDAO = transaccionDAO;
	}
	
	public void cargarTransaccionesPreferidas(Usuario usuario) {
		
		Session session = transaccionPreferidaDAO.getSessionFactory().getCurrentSession();		
		Query qry = session
				.createQuery("from TransaccionPreferida trans where trans.id.usuario=:usuario and trans.estado= 'A'");
		
		qry.setEntity("usuario", usuario);
		List lista = qry.list();
		
		Set<Transaccion> preferidas = new HashSet<Transaccion>();
		for (Iterator iterPreferidas = lista.iterator(); iterPreferidas.hasNext();) {
			TransaccionPreferida transaccionPreferida = (TransaccionPreferida) iterPreferidas.next();
			
			Transaccion t = (Transaccion) transaccionPreferida.getId().getTransaccion();
			
			if (tienePermiso(usuario, t)) {
				preferidas.add(t);
			}		
		}
		
		usuario.getFuncionespreferidas().clear();
		usuario.getFuncionespreferidas().addAll(preferidas);
		
		//usuarioDAO.save(usuario);
	}

	public boolean tienePermiso(Usuario usuario, Transaccion transaccion) {
		// TODO Auto-generated method stub
		boolean conPermiso = false;
		
		if (usuario.getGrupos().size() >= 0) {

			for (Grupo grupo : usuario.getGrupos()) {

				if (grupo.getId().getSistema().equals(sistema)) {

					if (grupo.getTransacciones().contains(transaccion)) {
						conPermiso = true;
					}

				}

			}
		}

		
		return conPermiso;
	}

	public TransaccionPreferidaDAO getTransaccionPreferidaDAO() {
		return transaccionPreferidaDAO;
	}

	public void setTransaccionPreferidaDAO(
			TransaccionPreferidaDAO transaccionPreferidaDAO) {
		this.transaccionPreferidaDAO = transaccionPreferidaDAO;
	}
}
